package com.example.royalchef.view;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;

/**
 * Created by Administrator on 2017/5/5.
 * 自定义布局:用来让控件自动布局
 */
public class AutoLayout extends ViewGroup {

        public AutoLayout(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
        }

        public AutoLayout(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }

        public AutoLayout(Context context) {
            this(context, null);
        }

        @Override
        protected void onLayout(boolean changed, int l, int t, int r, int b) {
            layoutHorizontal();
        }

        private void layoutHorizontal() {
            final int count = getChildCount();
            final int lineWidth = getMeasuredWidth() - getPaddingLeft()
                    - getPaddingRight();
            int paddingTop = getPaddingTop();
            int childTop = 0;
            int childLeft = getPaddingLeft();

            int availableLineWidth = lineWidth;
            int maxLineHeight = 0;

            for (int i = 0; i < count; i++) {
                final View child = getChildAt(i);
                if (child == null) {
                    continue;
                } else if (child.getVisibility() != GONE) {
                    final int childWidth = child.getMeasuredWidth();
                    final int childHeight = child.getMeasuredHeight();

                    if (availableLineWidth < childWidth) {
                        availableLineWidth = lineWidth;
                        paddingTop = paddingTop + maxLineHeight;
                        childLeft = getPaddingLeft();
                        maxLineHeight = 0;
                    }
                    childTop = paddingTop;
                    setChildFrame(child, childLeft, childTop, childWidth,
                            childHeight);
                    childLeft += childWidth;
                    availableLineWidth = availableLineWidth - childWidth;
                    maxLineHeight = Math.max(maxLineHeight, childHeight);
                }
            }
        }

        private void setChildFrame(View child, int left, int top, int width,
                                   int height) {
            child.layout(left, top, left + width, top + height);
        }

        @Override
        protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
            final int heightMode = MeasureSpec.getMode(heightMeasureSpec);
            int count = getChildCount();
            for (int i = 0; i < count; i++) {
                measureChild(getChildAt(i), widthMeasureSpec, heightMeasureSpec);
            }
            if (heightMode == MeasureSpec.AT_MOST||heightMode == MeasureSpec.UNSPECIFIED) {
                final int width = MeasureSpec.getSize(widthMeasureSpec);
                super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(
                        getDesiredHeight(width), MeasureSpec.EXACTLY));
            } else {
                super.onMeasure(widthMeasureSpec, heightMeasureSpec);
            }
        }

        private int getDesiredHeight(int width) {
            final int lineWidth = width - getPaddingLeft() - getPaddingRight();
            int availableLineWidth = lineWidth;
            int totalHeight = getPaddingTop() + getPaddingBottom();
            int lineHeight = 0;
            for (int i = 0; i < getChildCount(); i++) {
                View child = getChildAt(i);
                final int childWidth = child.getMeasuredWidth();
                final int childHeight = child.getMeasuredHeight();
                if (availableLineWidth < childWidth) {
                    availableLineWidth = lineWidth;
                    totalHeight = totalHeight + lineHeight;
                    lineHeight = 0;
                }
                availableLineWidth = availableLineWidth - childWidth;
                lineHeight = Math.max(childHeight, lineHeight);
            }
            totalHeight = totalHeight + lineHeight;
            return totalHeight;
        }

    }
